/**
 * Request.js
 * 通过promise对axios做二次封装，针对用户端参数，做灵活配置
 */
import {ElMessage, ElLoading} from 'element-plus';
import httpUtils from '../http/HttpUtils'
import {RESPONSE_ERROR_CODE} from '../../consts/Codes'
import {useRouter} from 'vue-router';


/**
 * 核心函数，可通过它处理一切请求数据，并做横向扩展
 * @param {url} 请求地址
 * @param {params} 请求参数
 * @param {options} 请求配置，针对当前本次请求；
 * @param loading 是否显示loading
 * @param mock 本次是否请求mock而非线上
 * @param error 本次是否显示错误
 */



function request(url, params, options = {loading: true, error: true}, method) {
    let loadingInstance;
    // 请求前loading
    if (options.loading) {
        loadingInstance = ElLoading.service();
    }
    const router = useRouter();
    return new Promise((resolve, reject) => {
        let data = {}
        // get请求使用params字段
        if (method == 'get') data = {params}
        // post请求使用data字段
        if (method == 'post') data = {data: params}
        httpUtils({
            url,
            method,
            ...data
        }).then(res => {
            if (res.code === RESPONSE_ERROR_CODE.NO_LOGIN.value) {
                router.push("/login");
            }
            resolve(res);
        }).catch((error) => {
            reject(error);
        }).finally(() => {
            if (loadingInstance) {
                loadingInstance.close();
            }
        })
    })
}


const get = (url, params, options) => request(url, params, options, 'get');
const post = (url, params, options) => request(url, params, options, 'post');

export default {
    get, post
}


